home *** CD-ROM | disk | FTP | other *** search
- #
- # This file is part of OpenVIP (http://openvip.sourceforge.net)
- #
- # Copyright (C) 2002-2003
- # Michal Dvorak, Jiri Sedlar, Antonin Slavik, Vaclav Slavik, Jozef Smizansky
- #
- # This program is licensed under GNU General Public License version 2;
- # see file COPYING in the top level directory for details.
- #
- # $Id: PreviewFrame.py,v 1.9 2003/06/18 16:55:08 vaclavslavik Exp $
- #
- # Window which displays video frame selected on timeline
- #
-
- from wxPython.wx import *
- import globals, model, render, worker, openvip, notify
- from conv2 import getBestAudioFormat, getBestVideoFormat
-
- class PreviewFrame(wxFrame):
- """This is a simple window which displays the bitmap corresponding
- to the current video frame on timeline. It is updated each time
- you left-click somewhere on timeline."""
- def __init__(self, *args, **kwds):
- # begin wxGlade: PreviewFrame.__init__
- kwds["style"] = wxDEFAULT_DIALOG_STYLE
- wxFrame.__init__(self, *args, **kwds)
- self.bitmap = wxStaticBitmap(self, -1, wxNullBitmap)
-
- self.__set_properties()
- self.__do_layout()
- # end wxGlade
- self.frame_number = 0
- self.model = None
- self.rendering = False
- self.renderAgain = False
- self.pos = 0
- self.vf = self.info = None
- self.enable = False
- render.EVT_RENDERING_DONE(self, self.OnPreviewRendered)
-
- def __set_properties(self):
- # begin wxGlade: PreviewFrame.__set_properties
- self.SetTitle("Preview")
- # end wxGlade
-
- def __do_layout(self):
- # begin wxGlade: PreviewFrame.__do_layout
- sizer = wxBoxSizer(wxVERTICAL)
- sizer.Add(self.bitmap, 0, wxEXPAND, 0)
- self.SetAutoLayout(1)
- self.SetSizer(sizer)
- sizer.Fit(self)
- sizer.SetSizeHints(self)
- self.Layout()
- # end wxGlade
-
- def WaitUntilNotUsed(self):
- if self.rendering:
- self.renderAgain = False
- busy = wxBusyCursor()
- while self.rendering:
- wxYield()
-
- def SetPosition(self, pos):
- """Used by the timeline widget to tell us the current position
- in seconds. This is later converted to a frame number."""
- self.pos = pos
- self.RenderFrame()
-
- def SetModel(self, model):
- """Informs the window that it should update the bitmap because
- timeline model changed."""
- self.enable = False
- self.model = model
- if model != None:
- self.vf = getBestVideoFormat(self.model,self.model.length(),self.model.beginning())
- if model == None or self.vf==None:
- img = wxEmptyImage(1,1)
- bmp = wxBitmapFromImage(img)
- self.bitmap.SetBitmap(bmp)
- return
- self.SetSize(wxSize(self.vf.width, self.vf.height))
- s = self.model.tonetworkxml(None, self.vf, None, previewQuality=True)
- self.previewNet = \
- globals.core.load_network_with_memoutput_from_string(s,
- "saver",
- self.vf.width, self.vf.height,
- openvip.DestCallback(None))
- self.info = globals.core.get_task_file_info(self.previewNet, "saver")
- if len(self.info.video_streams)<1: return
- self.enable = True
- self.RenderFrame()
-
- def RenderFrame(self):
- """Compute the frame number and render the frame. Then next call is
- blocked until the first frame rendering finished."""
- if self.enable == False: return
- if not self.IsShown(): return
- if self.rendering:
- self.renderAgain = True
- return
- self.renderAgain = False
- self.frame_number = int((self.pos-self.model.beginning())*self.vf.fps)
- if not 0<=self.frame_number<self.info.video_streams[0].length:
- img = wxEmptyImage(self.vf.width, self.vf.height)
- bmp = wxBitmapFromImage(img)
- self.bitmap.SetBitmap(bmp)
- else:
- self.rendering = True
- render.renderSingleFrame(self.previewNet, self.frame_number, self)
-
- def OnPreviewRendered(self, event):
- """This method receives the rendered frame and displays it."""
- if event.data != None:
- img = wxEmptyImage(self.vf.width, self.vf.height)
- img.SetData(event.data)
- bmp = wxBitmapFromImage(img)
- self.bitmap.SetBitmap(bmp)
- self.rendering = False
- if self.renderAgain:
- self.renderAgain = False
- self.RenderFrame()
-
- # end of class PreviewFrame
-
-
-